home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / PowerPlant / CContextHandler / CContextHandler.cp < prev    next >
Text File  |  1995-10-09  |  6KB  |  219 lines

  1. // =================================================================================
  2. //    CContextHandler.cp    version 1.0        ©1995 Harold Ekstrom. All rights reserved.
  3. // =================================================================================
  4. //    This class may be freely used in any project.  The source itself may not
  5. //    be sold.  The source may be placed on ftp sites, BBSs, and similar locations
  6. //    but distribution on solid media, CD, floppy, etc, requires my permission.
  7. //
  8. //    See header file for explanation and usage.
  9.  
  10. #include <LCommander.h>
  11. #include <LWindow.h>
  12. #include <UException.h>
  13.  
  14. #include "CContextHandler.h"
  15.  
  16. ContextReplyUPP    CContextHandler::sContextReplyUPP = NewContextReplyProc( CContextHandler::ContextReplyProc );
  17.  
  18.  
  19. // ---------------------------------------------------------------------------------
  20. //        • CContextHandler
  21. // ---------------------------------------------------------------------------------
  22.  
  23. CContextHandler::CContextHandler(
  24.     AEEventID    inEventID )
  25.         : mContextRefNum( -1 )
  26. {
  27.     // Make sure AppleGuide is available.
  28.     Boolean    isAppleGuideAvailable;
  29.     SInt32    theResult;
  30.     isAppleGuideAvailable = Gestalt( gestaltHelpMgrAttr, &theResult ) == noErr &&
  31.         (theResult & (1L << gestaltAppleGuidePresent)) != 0;
  32.     ThrowIfNot_( isAppleGuideAvailable );
  33.     
  34.     // Install the context reply proc.
  35.     ThrowIfOSErr_( ::AGInstallContextHandler( sContextReplyUPP,
  36.         inEventID, (long) this, &mContextRefNum ) );
  37. }
  38.  
  39.  
  40. // ---------------------------------------------------------------------------------
  41. //        • ~CContextHandler
  42. // ---------------------------------------------------------------------------------
  43.  
  44. CContextHandler::~CContextHandler()
  45. {
  46.     // Remove the handler.
  47.     ::AGRemoveContextHandler( &mContextRefNum );
  48. }
  49.  
  50.  
  51. // ---------------------------------------------------------------------------------
  52. //        • ContextReplyProc
  53. // ---------------------------------------------------------------------------------
  54.  
  55. pascal OSErr
  56. CContextHandler::ContextReplyProc(
  57.     Ptr                inData,
  58.     Size            inDataSize,
  59.     Ptr                *outData,
  60.     Size            *outDataSize,
  61.     AGAppInfoHdl    inAppInfo )
  62. {
  63.     OSErr    err = noErr;
  64.  
  65. #if !GENERATINGCFM
  66.     // Setup our A5 world.
  67.     // This may not be necessary but better safe than sorry.
  68.     long    theOldA5 = ::SetCurrentA5();
  69. #endif
  70.  
  71.     Try_ {
  72.  
  73.         // Get the handler.
  74.         CContextHandler    *theHandler;
  75.         theHandler = (CContextHandler *) (**inAppInfo).refCon;
  76.         ThrowIfNil_( theHandler );
  77.  
  78.         // Perform the context check.
  79.         Boolean    theResult;
  80.         theResult = theHandler->DoContextCheck( inData, inDataSize );
  81.  
  82.         // Allocate the reply data.
  83.         *outData = ::NewPtr( sizeof(Boolean) );
  84.         ThrowIfMemFail_( *outData );
  85.  
  86.         // Fill in the reply data.
  87.         *(Boolean *)*outData = theResult;
  88.         *outDataSize = sizeof(Boolean);
  89.  
  90.     } Catch_( inErr ) {
  91.  
  92.         err = inErr;
  93.  
  94.     } EndCatch_
  95.     
  96. #if !GENERATINGCFM
  97.     // Restore A5 to the old value.
  98.     ::SetA5( theOldA5 );
  99. #endif
  100.  
  101.     return err;
  102. }
  103.  
  104.  
  105. #pragma mark -
  106.  
  107. // ---------------------------------------------------------------------------------
  108. //        • CCmdContextHandler
  109. // ---------------------------------------------------------------------------------
  110.  
  111. CCmdContextHandler::CCmdContextHandler(
  112.     AEEventID    inEventID )
  113.         : CContextHandler( inEventID )
  114. {
  115. }
  116.  
  117.  
  118. // ---------------------------------------------------------------------------------
  119. //        • ~CCmdContextHandler
  120. // ---------------------------------------------------------------------------------
  121.  
  122. CCmdContextHandler::~CCmdContextHandler()
  123. {
  124. }
  125.  
  126.  
  127. // ---------------------------------------------------------------------------------
  128. //        • DoContextCheck
  129. // ---------------------------------------------------------------------------------
  130.  
  131. Boolean
  132. CCmdContextHandler::DoContextCheck(
  133.     const Ptr        inData,
  134.     Size            inDataSize )
  135. {
  136.     Boolean    isEnabled = false;
  137.  
  138.     // Get the command number to test.
  139.     ThrowIf_( inDataSize != sizeof(CommandT) );
  140.     CommandT    theCommand;
  141.     theCommand = *(CommandT *) inData;
  142.     
  143.     // Get the current target.
  144.     LCommander    *theTarget = LCommander::GetTarget();
  145.     
  146.     if ( theTarget != nil ) {
  147.  
  148.         // Get the command status.
  149.         Boolean        usesMark = false;
  150.         Char16        mark = noMark;
  151.         Str255        itemName;    
  152.         itemName[0] = 0;
  153.         theTarget->ProcessCommandStatus( theCommand,
  154.             isEnabled, usesMark, mark, itemName );
  155.  
  156.     }
  157.     
  158.     return isEnabled;
  159. }
  160.  
  161.  
  162. #pragma mark -
  163.  
  164. // ---------------------------------------------------------------------------------
  165. //        • CPaneIDContextHandler
  166. // ---------------------------------------------------------------------------------
  167.  
  168. CPaneIDContextHandler::CPaneIDContextHandler(
  169.     AEEventID    inEventID )
  170.         : CContextHandler( inEventID )
  171. {
  172. }
  173.  
  174.  
  175. // ---------------------------------------------------------------------------------
  176. //        • ~CPaneIDContextHandler
  177. // ---------------------------------------------------------------------------------
  178.  
  179. CPaneIDContextHandler::~CPaneIDContextHandler()
  180. {
  181. }
  182.  
  183.  
  184. // ---------------------------------------------------------------------------------
  185. //        • DoContextCheck
  186. // ---------------------------------------------------------------------------------
  187.  
  188. Boolean
  189. CPaneIDContextHandler::DoContextCheck(
  190.     const Ptr        inData,
  191.     Size            inDataSize )
  192. {
  193.     Boolean    theResult = false;
  194.  
  195.     // Get the pane id to test.
  196.     ThrowIf_( inDataSize != sizeof(PaneIDT) );
  197.     PaneIDT    thePaneID;
  198.     thePaneID = *(PaneIDT *) inData;
  199.  
  200.     // Get the front window.
  201.     WindowPtr    theMacWindowP = ::FrontWindow();
  202.  
  203.     if ( theMacWindowP != nil ) {
  204.  
  205.         // Get the PowerPlant window object.
  206.         LWindow    *theWindow = LWindow::FetchWindowObject( theMacWindowP );
  207.         
  208.         if ( theWindow != nil ) {
  209.         
  210.             // Test the pane id.
  211.             theResult = (thePaneID == theWindow->GetPaneID());
  212.         
  213.         }
  214.     
  215.     }
  216.  
  217.     return theResult;
  218. }
  219.